/*
 * Copyright (c) 2019- 2019 threefish(https://gitee.com/threefish https://github.com/threefish) All Rights Reserved.
 * 本项目完全开源，商用完全免费。但请勿侵犯作者合法权益，如申请软著等。
 * 最后修改时间：2019/10/07 18:26:07
 * 源 码 地 址：https://gitee.com/threefish/NutzFw
 */

package com.glp.work.flow.workflow.plugin.flowable.service;

import com.github.pagehelper.PageInfo;
import com.glp.common.reponse.BaseResult;
import com.glp.work.flow.dto.ProcessAndModelVo;
import com.glp.work.flow.dto.UserDTO;
import com.glp.work.flow.dto.UserTaskDto;
import com.glp.work.flow.dto.request.ModelDto;
import com.glp.work.flow.dto.request.ModelListRequestDto;
import com.glp.work.flow.pojo.WfPlatformDefModle;
import com.glp.work.flow.request.ProcessInitiateRequest;
import com.glp.work.flow.workflow.plugin.flowable.dto.*;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.UserTask;
import org.flowable.validation.ValidationError;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * @author Pan Wang
 * @date: 2019/4/17
 */
public interface FlowProcessDefinitionService {
    /**
     * 获取流程定义
     *
     * @param procDefKey 流程定义KEY
     * @return
     */
    Map<String, Object> getProcessDefinitionByKey(String procDefKey);


    /**
     * 查询流程定义列表
     */
    FlowDataListDTO<ProcessDefinitionEntitDTO> queryProcessDefinitionList(FlowDataListDTO<ProcessDefinitionEntitDTO> flowDataListDto);

    PageInfo<ProcessDefinitionEntitDTO> queryProcessDefinitionList(ProcessDefQueryDto dto);


    /**
     * 读取资源，通过部署ID
     *
     * @param processDefinitionId 流程定义ID
     * @param processInstanceId   流程实例ID
     * @param resourceType        资源类型(xml|image)
     */
    InputStream resourceRead(String processDefinitionId, String processInstanceId, String resourceType);

    /**
     * 挂起、激活流程实例
     *
     * @param state
     * @param procDefId
     * @return
     */
    String updateState(String state, String procDefId);

    String deploy(String modelId);

    void delete(String modelId);

    /**
     * 删除部署的流程，级联删除流程实例
     *
     * @param deploymentId 流程部署ID
     */
    void deleteDeployment(String deploymentId);

    /**
     * 获取end节点
     *
     * @param processDefId
     * @return FlowElement
     */
    FlowElement findEndFlowElement(String processDefId);

    /**
     * 获取MainProcess
     *
     * @param processDefId
     * @return FlowElement
     */
    Process findMainProcess(String processDefId);

    /**
     * 获取外部表单执行器表达式
     *
     * @param processDefId
     * @return FlowElement
     */
    String findExternalFormExecutor(String processDefId);

    /**
     * 获取指定节点的节点信息
     *
     * @param activityId          当前步骤ID
     * @param processDefinitionId 流程定义ID
     * @return
     */
    FlowElement getFlowElementByActivityIdAndProcessDefinitionId(String activityId, String processDefinitionId);

    /**
     * 取得用户节点
     *
     * @param activityId
     * @param processDefinitionId
     * @return
     */
    UserTask getUserTask(String activityId, String processDefinitionId);

    /**
     * 取得用户节点
     *
     * @param activityId
     * @param processDefinitionId key:version:id
     * @return
     */
    UserTaskExtensionDTO getUserTaskExtension(String activityId, String processDefinitionId);

    /**
     * 根据流程定义key 获取所有UserTask节点
     *
     * @param processDefKey processDefKey
     * @return List<UserTask>
     */
    List<UserTask> getUserTaskList(String processDefKey);

    /**
     * 根据流程定义ID 获取userTask
     *
     * @param proDefId
     * @return
     */
    List<UserTask> getUserTaskListById(String proDefId);

    /**
     * 根据流程定义ID 获取userTask
     *
     * @param proDefId
     * @return
     */
    List<FlowElement> getProcessNodeListById(String proDefId);

    /**
     * 上传BPMN
     *
     * @param fileName
     * @param inputStream
     */
    String uploadBPMN(MultipartFile file, String userNo);

    /**
     * 新建model
     *
     * @param dto
     */
    BaseResult addModel(ModelCreateDto dto);

    BaseResult addModelNew(String userNo, ModelCreateDto dto);

    /**
     * 查询models
     *
     * @param dto
     */
    BaseResult getModels(ModelListRequestDto dto);

    /**
     * 查询model详情
     *
     * @param modelId
     * @return
     */
    BaseResult<Map<String, Object>> modelInfo(String modelId);


    /**
     * 启用 挂起  归档
     *
     * @param procDefId
     * @param status
     * @return
     */
    BaseResult modelStatusUpdateNew(String procDefId, String status, String modelId, String userNo, String userName);

    /**
     * 启用或者挂起
     *
     * @param procDefId
     * @param status
     * @return
     */
    BaseResult modelStatusUpdate(String procDefId, String status);

    /**
     * /启用/禁用/归档
     *
     * @param ids
     * @param
     * @return
     */
    BaseResult modelStatusUpdatedeploy(String cachedValue);


    /**
     * model定义校验
     *
     * @param json
     * @return
     */
    List<ValidationError> validate(String json);

    /**
     * model 保存
     *
     * @param modelId
     * @param dto
     * @return
     */
    BaseResult<String> saveModel(String modelId, ModelSaveDto dto);

    /**
     * model 保存
     *
     * @param
     * @return
     */
    BaseResult<String> saveModelNew(ModelDto modelDto, String userNo);

    BaseResult<String> saveModel2(String modelId, ModelSaveDto dto, String userNo);

    /**
     * 查询流程用户节点详情
     *
     * @param procInstId
     * @return
     */
    List<UserTaskDto> userTaskDetailsNew(String modelId);

    /**
     * 下载bpmn文件
     *
     * @param modeId
     * @return
     */
    ByteArrayOutputStream downLoadBpmn(String modeId) throws Exception;

    void setUserTask(String moudelId, String proDefId, String origActId, String name, String documentation);

    /* PageInfo<ProcessAndModelVo> queryProcessAndModel(ProcessAndModelDto processAndModelDto);*/

    BaseResult userTaskDetails(String modelId);

    PageInfo<ProcessAndModelVo> queryProcessAndModel2(ProcessAndModelDto processAndModelDto, Integer pageSize, Integer pageNum);

    BaseResult noModelStatusUpdatedeploy(String cachedValue);

    /***
     * @description : 修改流程发起工作流
     * @params : [processInitiateRequest, user, superProcess, split, wfPlatformDefModles]
     * @returns : com.glp.common.reponse.BaseResult
     * @author : 郭永伟
     * @date : 2021/1/12
     */
    BaseResult processInitate(Map<String, Object> preVariable, UserDTO user, String superProcess, String[] split, List<WfPlatformDefModle> wfPlatformDefModles);

    /**
     * @description : 查询应用对应的流程
     * @author : 郭永伟 
     * @params [appId, pageSize, pageNum]     
     * @date : 2021/2/22
    */
    PageInfo<ProcessAndModelVo> queryAPPProcess(String appId, Integer pageSize, Integer pageNum);

    /*String queryModelName();*/
}
